关于KEIL5编译出现“Target not createt”全系列解决办法 | 您所在的位置:网站首页 › target not halted › 关于KEIL5编译出现“Target not createt”全系列解决办法 |
前言
在KEIL5编程,往往遇到许多“Target not createt”,即目标不能实现这类情况。由此为帮助大家解决这些问题特开此贴。 目录如下: 1、2K字节限制错误 ERROR:RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT 或者 ADDRESS SPACE OVERFLOW 直达链接:https://blog.csdn.net/SumubeiFZ/article/details/125344372 2、程序溢出错误 ERROR: PUBLIC REFERS TO IGNORED SEGMEN 直达链接:https://blog.csdn.net/SumubeiFZ/article/details/125346305 一、问题产生当编译出现如上情况时候,其实是由于地址空间溢出。 这其实是因为(默认配置下)系统会将变量分配到data空间,即内部RAM空间,大小取决于你所选用的单片机。如果你定义了太多的函数及变量,超出了地址空间,导致有些变量或者函数没有空间定义了。 二、解决办法:解决的核心是使用其他的空间进行存储实变量及函数。有以下两种方法: 1、代码上直接将变量存储到其他存储器(1)使用默认存储区的示例: int a; 上述代码中:若KEIL的Target中默认设置为data存储区,则直接存入data存储区。 (2)使用指定存储器区: int xdata b; int pdata c; int code temp[]={0, 0, 0, 0, 0, 0}; 上述代码中:指定了变量的存储区,则变量b直接存入xdata外部存储区,变量c直接存入pdata外部存储区,数组temp 直接存入了code程序存储区 PS:外部存储区可读可修改,code程序存储区数据不可被修改。 当然若将数据存入外部存储器,将会降低程序运行的速度。 2、修改默认存储区(1)首先,打开 Options for target ,如图所示。 (2)然后在 Target 里修改存储的空间,其中有以下三项: 内部存储区DATA:内部RAM,固定指前面0x00~0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。外部扩展区XDATA:外部扩展RAM,一般指外部0x0000~0xffff空间,用DPTR访问。这里推荐使用该存储区。外部存储区PDATA:外部扩展RAM的低256个字节,地址出现在A0-A7上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好像对此有BUG,建议少用。
这里建议改为XDATA。 但是由于代码量实在过大,也会超出XDATA的存储范围,导致编译不能实现。因此建议使用第一种方法自行定义变量存储区。 当然这里有点是要注意的。自己的Code Rom Size是否设置正确,可自行参考自己的单片手册。 如果设置不正确也会导致编译无法实现。 PS:使用不同的存储器,将使程序执行效率不同,在编写程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率。 |
CopyRight 2018-2019 实验室设备网 版权所有 |